// 生成批量插入数据的JavaScript脚本
// 数据时间范围：2025年1月1日到10月17日
// 数据量：党组织10条，党员800条，党建活动2000条，生产效能1800条，党建生产关联1500条

const fs = require('fs');

// 基础数据配置
const config = {
  startDate: '2025-01-01',
  endDate: '2025-10-17',
  outputFile: 'bulk_insert_large_data.sql',
  recordCounts: {
    organizations: 10,
    members: 800,
    activities: 2000,
    efficiency: 1800,
    links: 1500
  }
};

// 党组织基础数据
const organizations = [
  { org_code: 'PO001', org_name: 'XX机械制造有限公司党委', industry_type: '机械制造', region: '江苏省苏州市' },
  { org_code: 'PO002', org_name: '第一车间党支部', industry_type: '机械制造', region: '江苏省苏州市' },
  { org_code: 'PO003', org_name: '第二车间党支部', industry_type: '机械制造', region: '江苏省苏州市' },
  { org_code: 'PO004', org_name: '研发中心党支部', industry_type: '机械制造', region: '江苏省苏州市' },
  { org_code: 'PO005', org_name: '质量检测党支部', industry_type: '机械制造', region: '江苏省苏州市' },
  { org_code: 'PO006', org_name: '电子设备事业部党总支', industry_type: '电子设备', region: '江苏省苏州市' },
  { org_code: 'PO007', org_name: '电子组装党支部', industry_type: '电子设备', region: '江苏省苏州市' },
  { org_code: 'PO008', org_name: '电路设计党支部', industry_type: '电子设备', region: '江苏省苏州市' },
  { org_code: 'PO009', org_name: '汽车零部件分公司党委', industry_type: '汽车零部件', region: '浙江省杭州市' },
  { org_code: 'PO010', org_name: '精密加工党支部', industry_type: '汽车零部件', region: '浙江省杭州市' }
];

// 活动类型配置
const activityTypes = [
  { id: 1, name: '理论学习', themes: ['党的二十大精神学习', '党纪学习教育', '廉洁从业教育', '新技术应用培训', '政治理论研讨', '党史学习'] },
  { id: 2, name: '技术攻关', themes: ['智能制造技术攻关', '工艺优化创新', '设备自动化升级', '节能降耗改造', '新产品研发', '工艺改进'] },
  { id: 3, name: '质量提升', themes: ['质量提升月活动', '成本控制研讨', '零缺陷质量管理', '质量意识培训', 'QC小组活动', '质量改进'] },
  { id: 4, name: '安全生产', themes: ['安全生产责任区', '安全知识竞赛', '应急演练', '设备维护保养', '隐患排查', '安全培训'] },
  { id: 5, name: '志愿服务', themes: ['社区志愿服务', '学雷锋活动', '环境保护', '扶贫帮困', '文明创建', '公益服务'] },
  { id: 6, name: '组织生活', themes: ['组织生活会', '民主评议党员', '主题党日活动', '批评与自我批评', '党员大会', '支委会'] }
];

// 详细的活动内容模板
const activityContents = {
  1: [
    '组织全体党员深入学习党的创新理论，开展专题研讨交流',
    '邀请专家进行专题讲座，提升党员政治理论水平',
    '开展读书分享会，交流学习心得和体会',
    '组织观看教育影片，增强党性修养',
    '开展知识竞赛，检验学习成果'
  ],
  2: [
    '组建党员技术攻关团队，解决生产中的技术难题',
    '开展技术创新竞赛，激发党员创新活力',
    '组织技术交流活动，分享先进经验',
    '实施技术改造项目，提升生产效率',
    '开展技能培训，提高党员技术水平'
  ],
  3: [
    '开展质量意识教育，树立质量第一理念',
    '组织质量检查评比，发现问题及时整改',
    '实施质量改进项目，提升产品质量水平',
    '开展QC小组活动，解决质量问题',
    '组织质量培训，提高全员质量意识'
  ],
  4: [
    '设立党员安全责任区，落实安全责任制',
    '开展安全隐患排查，消除安全风险',
    '组织安全应急演练，提高应急处置能力',
    '开展安全知识培训，增强安全意识',
    '实施安全改进措施，提升安全管理水平'
  ],
  5: [
    '组织党员开展社区志愿服务活动',
    '开展环境保护公益活动',
    '组织扶贫帮困活动，帮助困难群众',
    '开展文明创建活动，提升城市形象',
    '组织公益服务活动，服务社会大众'
  ],
  6: [
    '严肃开展批评与自我批评',
    '进行民主评议党员工作',
    '组织开展主题党日活动',
    '召开党员大会研究重要事项',
    '开展组织生活会交流思想'
  ]
};

// 工具函数
const utils = {
  // 生成随机数
  randomInt: (min, max) => Math.floor(Math.random() * (max - min + 1)) + min,
  
  // 生成随机小数
  randomFloat: (min, max, decimals = 2) => {
    const rand = Math.random() * (max - min) + min;
    return parseFloat(rand.toFixed(decimals));
  },
  
  // 生成日期
  randomDate: (start, end) => {
    const startDate = new Date(start);
    const endDate = new Date(end);
    const randomTime = startDate.getTime() + Math.random() * (endDate.getTime() - startDate.getTime());
    return new Date(randomTime);
  },
  
  // 格式化日期为SQL格式
  formatDate: (date) => date.toISOString().slice(0, 19).replace('T', ' '),
  
  // 从数组中随机选择
  randomChoice: (array) => array[Math.floor(Math.random() * array.length)],
  
  // 生成随机文本
  generateText: (minWords, maxWords) => {
    const words = ['完成', '组织', '开展', '提升', '改进', '优化', '解决', '实施', '推进', '加强', 
                  '提高', '降低', '增强', '完善', '创新', '突破', '达成', '实现', '落实', '深化',
                  '促进', '推动', '强化', '确保', '巩固', '发展', '建设', '创建', '打造', '培育'];
    const wordCount = utils.randomInt(minWords, maxWords);
    let text = '';
    for (let i = 0; i < wordCount; i++) {
      text += utils.randomChoice(words);
      if (i < wordCount - 1) text += '，';
    }
    return text + '。';
  },

  // 生成活动总结
  generateSummary: (activityType) => {
    const summaries = {
      1: ['理论学习深入扎实', '思想认识明显提高', '理论水平得到提升', '政治素养不断增强'],
      2: ['技术难题有效解决', '创新成果显著', '技术水平明显提升', '工艺改进效果明显'],
      3: ['质量意识显著增强', '产品质量稳步提升', '质量管理更加规范', '质量改进成效显著'],
      4: ['安全意识明显提高', '安全管理更加规范', '安全风险有效控制', '安全状况持续改善'],
      5: ['服务群众效果良好', '社会责任充分体现', '志愿服务受到好评', '公益活动影响积极'],
      6: ['组织生活严肃规范', '党员教育效果明显', '党内民主充分发扬', '组织建设不断加强']
    };
    
    const baseSummary = utils.randomChoice(summaries[activityType]);
    const additional = utils.generateText(3, 6);
    return `${baseSummary}，${additional}`;
  },

  // 生成身份证号
  generateIdCard: (birthDate) => {
    const areaCodes = ['320501', '330101', '320582', '330108', '320505'];
    const areaCode = utils.randomChoice(areaCodes);
    const birthStr = birthDate.toISOString().slice(2, 10).replace(/-/g, '');
    const sequence = utils.randomInt(1000, 9999).toString();
    return areaCode + birthStr + sequence;
  },

  // 生成成果等级（100-优秀，75-良好，50-一般，25-较差，0-极差）
  generateAchievementLevel: () => {
    const weights = [100, 75, 50, 25, 0];
    const probabilities = [0.3, 0.4, 0.2, 0.07, 0.03]; // 概率分布
    const rand = Math.random();
    let cumulative = 0;
    for (let i = 0; i < probabilities.length; i++) {
      cumulative += probabilities[i];
      if (rand <= cumulative) return weights[i];
    }
    return 75; // 默认良好
  }
};

// 生成党组织数据
function generateOrganizations() {
  console.log('生成党组织数据...');
  let sql = '-- 党组织数据\nINSERT INTO `party_organization` VALUES\n';
  const orgData = [];
  
  organizations.forEach((org, index) => {
    const id = index + 1;
    const parent_org_code = org.org_code === 'PO001' || org.org_code === 'PO009' ? null : 
                          org.org_code.startsWith('PO00') ? 'PO001' : 'PO009';
    const org_level = org.org_code === 'PO001' || org.org_code === 'PO009' ? 1 : 
                     org.org_code === 'PO006' ? 2 : 3;
    
    const established_date = new Date(2018 + Math.floor(Math.random() * 3), 
                                    Math.floor(Math.random() * 12), 
                                    Math.floor(Math.random() * 28) + 1);
    
    const employee_count = utils.randomInt(150, 1200);
    const party_member_count = Math.floor(employee_count * utils.randomFloat(0.08, 0.15));
    
    const contactPersons = ['张伟', '李强', '王芳', '陈明', '赵静', '刘洋', '孙磊', '周婷', '吴刚', '郑华'];
    
    orgData.push(`(${id}, '${org.org_code}', '${org.org_name}', ${org_level}, ${parent_org_code ? `'${parent_org_code}'` : 'NULL'}, '${established_date.toISOString().slice(0, 10)}', ${employee_count}, ${party_member_count}, '${org.industry_type}', '${org.region}', '${org.region}详细地址${id}', '${contactPersons[index]}', '${org.region.startsWith('江苏') ? '0512' : '0571'}-6688${utils.randomInt(1000, 9999)}', 1, NOW(), NOW())`);
  });
  
  sql += orgData.join(',\n') + ';\n\n';
  return sql;
}

// 生成党员数据
function generatePartyMembers() {
  console.log('生成党员数据...');
  let sql = '-- 党员数据\nINSERT INTO `party_member` VALUES\n';
  const memberData = [];
  
  // 姓氏和名字池
  const lastNames = ['张', '李', '王', '刘', '陈', '杨', '赵', '黄', '周', '吴', '徐', '孙', '胡', '朱', '高', '林', '何', '郭', '马', '罗'];
  const maleNames = ['伟', '强', '勇', '军', '磊', '洋', '明', '海', '波', '鹏', '超', '杰', '斌', '浩', '宇', '峰', '平', '刚', '健', '翔'];
  const femaleNames = ['芳', '娜', '敏', '静', '丽', '艳', '玲', '娟', '莹', '洁', '雪', '梅', '婷', '颖', '慧', '悦', '琳', '丹', '瑶', '倩'];
  
  // 职务和职称配置
  const positions = {
    'PO001': ['党委书记', '党委副书记', '党委秘书', '组织委员', '宣传委员', '纪检委员'],
    'PO002': ['车间主任', '生产主管', '技术员', '操作工', '维修工', '班组长'],
    'PO003': ['车间主任', '工艺员', '质检员', '操作工', '设备管理员'],
    'PO004': ['研发总监', '研发工程师', '技术专家', '实验员', '项目负责人'],
    'PO005': ['质量经理', '检测工程师', '质检员', '质量主管', '标准化专员'],
    'PO006': ['事业部总经理', '副总经理', '部门经理', '主管', '专员'],
    'PO007': ['生产经理', '生产主管', '技术员', '操作工', '物料员'],
    'PO008': ['设计主管', '电气工程师', 'PCB设计师', '软件工程师', '测试工程师'],
    'PO009': ['分公司总经理', '副总经理', '部门总监', '经理', '主管'],
    'PO010': ['车间主任', '工艺主管', '技术员', '操作工', '质检员']
  };

  const technicalTitles = ['技术员', '助理工程师', '工程师', '高级工程师', '技师', '高级技师'];
  const departments = ['生产部', '技术部', '质量部', '研发部', '设备部', '设计部', '行政部', '人力资源部', '财务部'];
  const partyDuties = ['党委书记', '党支部书记', '组织委员', '宣传委员', '纪检委员', '青年委员', null, null, null, null];

  let memberId = 1;
  
  organizations.forEach(org => {
    // 每个党组织分配不同数量的党员
    const memberCount = Math.floor(config.recordCounts.members / organizations.length) + 
                       utils.randomInt(-10, 10);
    
    for (let i = 0; i < memberCount && memberId <= config.recordCounts.members; i++) {
      const isMale = Math.random() > 0.35; // 男女比例约为65:35
      const lastName = utils.randomChoice(lastNames);
      const firstName = isMale ? utils.randomChoice(maleNames) : utils.randomChoice(femaleNames);
      const memberName = lastName + firstName;
      
      // 出生日期在1960-2000年之间
      const birthYear = utils.randomInt(1960, 2000);
      const birthDate = new Date(birthYear, 
                               utils.randomInt(0, 11), 
                               utils.randomInt(1, 28));
      
      // 入党日期在出生日期后22-35年
      const joinPartyYear = birthYear + 22 + utils.randomInt(0, 13);
      const joinPartyDate = new Date(joinPartyYear,
                                   utils.randomInt(0, 11),
                                   utils.randomInt(1, 28));
      
      const education = utils.randomInt(2, 5); // 大专到博士
      const workYears = new Date().getFullYear() - (birthYear + 18);
      const workAchievementScore = utils.randomFloat(70, 98, 2);
      const isKeyPosition = Math.random() > 0.6 ? 1 : 0;
      const honorCount = Math.floor(Math.random() * 8);
      const status = Math.random() > 0.95 ? utils.randomInt(2, 3) : 1; // 大部分在岗
      
      const orgPositions = positions[org.org_code] || ['员工', '主管', '经理'];
      const position = utils.randomChoice(orgPositions);
      const technicalTitle = utils.randomChoice(technicalTitles);
      const workDepartment = utils.randomChoice(departments);
      const partyDuty = utils.randomChoice(partyDuties);
      
      memberData.push(`(${memberId}, 'PM${memberId.toString().padStart(3, '0')}', '${memberName}', ${isMale ? 1 : 2}, '${birthDate.toISOString().slice(0, 10)}', '${joinPartyDate.toISOString().slice(0, 10)}', '${utils.generateIdCard(birthDate)}', ${education}, '${position}', '${technicalTitle}', '${workDepartment}', '${org.org_code}', ${workYears}, ${partyDuty ? `'${partyDuty}'` : 'NULL'}, ${workAchievementScore}, ${honorCount}, ${isKeyPosition}, ${status}, NOW(), NOW())`);
      
      memberId++;
    }
  });
  
  // 分批插入，每500条一个INSERT语句
  const batchSize = 500;
  let batchedSql = '';
  for (let i = 0; i < memberData.length; i += batchSize) {
    const batch = memberData.slice(i, i + batchSize);
    batchedSql += `INSERT INTO \`party_member\` VALUES\n${batch.join(',\n')};\n\n`;
  }
  
  return batchedSql;
}

// 生成党建活动数据
function generatePartyActivities() {
  console.log('生成党建活动数据...');
  let sql = '';
  const activityData = [];
  
  const startDate = new Date(config.startDate);
  const endDate = new Date(config.endDate);
  
  // 活动地点池
  const locations = [
    '公司总部会议室', '研发中心实验室', '各生产车间', '第一车间', '第二车间会议室',
    '周边社区', '质量检测部会议室', '电子组装车间会议室', '革命纪念馆', '研发中心培训室',
    '精密加工车间', '公司总部报告厅', '电路设计部会议室', '公司各场所', '研发中心展厅',
    '分公司培训中心', '电子设备事业部'
  ];
  
  let activityId = 1;
  
  for (let i = 0; i < config.recordCounts.activities; i++) {
    const org = utils.randomChoice(organizations);
    const activityType = utils.randomChoice(activityTypes);
    const theme = utils.randomChoice(activityType.themes);
    
    // 活动时间在2025年内随机分布
    const activityDate = utils.randomDate(startDate, endDate);
    
    // 不同类型活动持续时间不同
    let durationDays;
    if (activityType.id === 2) { // 技术攻关
      durationDays = utils.randomInt(30, 120);
    } else if (activityType.id === 3) { // 质量提升
      durationDays = utils.randomInt(15, 60);
    } else {
      durationDays = utils.randomInt(1, 3);
    }
    
    const endDateObj = new Date(activityDate);
    endDateObj.setDate(activityDate.getDate() + durationDays);
    
    // 确保结束日期不超过2025-10-17
    if (endDateObj > new Date(config.endDate)) {
      endDateObj.setTime(new Date(config.endDate).getTime());
    }
    
    const plannedParticipants = utils.randomInt(15, 120);
    const actualParticipants = Math.floor(plannedParticipants * utils.randomFloat(0.75, 1.05));
    const budget = activityType.id === 2 ? utils.randomFloat(10000, 200000, 2) : 
                  utils.randomFloat(2000, 50000, 2);
    const actualCost = budget * utils.randomFloat(0.8, 1.02);
    
    // 使用新的成果等级生成方法
    const achievementLevel = utils.generateAchievementLevel();
    
    // 活动状态：根据时间判断
    let status;
    const now = new Date();
    if (endDateObj < now) {
      status = 3; // 已完成
    } else if (activityDate > now) {
      status = 1; // 已计划
    } else {
      status = 2; // 进行中
    }
    
    // 有5%的概率活动被取消
    if (Math.random() < 0.05 && status === 1) {
      status = 4; // 已取消
    }
    
    // 生成主要参与党员（随机选择3-8个）
    const keyMembers = [];
    const memberCount = utils.randomInt(3, 8);
    for (let j = 0; j < memberCount; j++) {
      keyMembers.push(`PM${utils.randomInt(1, config.recordCounts.members).toString().padStart(3, '0')}`);
    }
    
    const activityContent = utils.randomChoice(activityContents[activityType.id]);
    const activitySummary = utils.generateSummary(activityType.id);
    
    activityData.push(`(${activityId}, 'PA${activityId.toString().padStart(4, '0')}', '${theme}活动', ${activityType.id}, '${theme}', '${utils.formatDate(activityDate)}', '${utils.formatDate(endDateObj)}', '${org.org_code}', '${utils.randomChoice(locations)}', ${actualParticipants}, ${plannedParticipants}, ${budget}, ${actualCost}, '${activityContent}', ${achievementLevel}, '${keyMembers.join(',')}', '${activitySummary}', ${status}, NOW(), NOW())`);
    
    activityId++;
  }
  
  // 分批插入，每500条一个INSERT语句
  const batchSize = 500;
  for (let i = 0; i < activityData.length; i += batchSize) {
    const batch = activityData.slice(i, i + batchSize);
    sql += `INSERT INTO \`party_activity\` VALUES\n${batch.join(',\n')};\n\n`;
  }
  
  return sql;
}

// 生成生产效能数据
function generateProductionEfficiency() {
  console.log('生成生产效能数据...');
  let sql = '';
  const efficiencyData = [];
  
  const startDate = new Date('2025-01-01');
  const endDate = new Date(config.endDate); // 生成到10月17日
  
  let recordId = 1;
  
  organizations.forEach(org => {
    let currentDate = new Date(startDate);
    
    // 每个组织每月生成记录
    while (currentDate <= endDate) {
      // 计算当月应该生成的记录数
      let recordsPerMonth = 20;
      if (currentDate.getMonth() === 9 && currentDate.getFullYear() === 2025) {
        // 10月份只生成到17号的记录
        recordsPerMonth = Math.floor(17 * (20 / 30));
      }
      
      for (let i = 0; i < recordsPerMonth; i++) {
        if (recordId > config.recordCounts.efficiency) break;
        
        const recordDate = new Date(currentDate);
        // 在当月内随机分布日期
        const maxDay = currentDate.getMonth() === 9 && currentDate.getFullYear() === 2025 ? 17 : 28;
        recordDate.setDate(utils.randomInt(1, maxDay));
        
        const recordMonth = recordDate.toISOString().slice(0, 7);
        
        // 根据不同产业类型生成不同的产值范围
        let productionValue;
        if (org.industry_type === '机械制造') {
          productionValue = utils.randomFloat(800, 2000, 2);
        } else if (org.industry_type === '电子设备') {
          productionValue = utils.randomFloat(600, 1500, 2);
        } else { // 汽车零部件
          productionValue = utils.randomFloat(1000, 2500, 2);
        }
        
        const productionTarget = productionValue * utils.randomFloat(0.95, 1.08);
        const qualityRate = utils.randomFloat(0.975, 0.999, 4);
        const qualityTarget = qualityRate * utils.randomFloat(0.99, 1.005);
        const innovationCount = utils.randomInt(1, 12);
        const costReductionRate = utils.randomFloat(0.015, 0.065, 4);
        const costReductionAmount = productionValue * costReductionRate;
        const safetyIncidentCount = Math.random() > 0.92 ? utils.randomInt(1, 3) : 0;
        const equipmentUtilization = utils.randomFloat(0.82, 0.96, 4);
        const laborProductivity = utils.randomFloat(5.5, 11.5, 2);
        const energyConsumption = productionValue * utils.randomFloat(0.075, 0.125, 2);
        
        const remarks = [
          '生产任务完成良好', '质量指标稳定', '技术创新成果显著', '成本控制效果明显',
          '设备运行正常', '安全生产形势良好', '效率提升明显', '能耗控制达标'
        ];
        
        efficiencyData.push(`(${recordId}, 'PE${recordId.toString().padStart(4, '0')}', '${org.org_code}', '${recordDate.toISOString().slice(0, 10)}', '${recordMonth}', ${productionValue}, ${productionTarget}, ${qualityRate}, ${qualityTarget}, ${innovationCount}, ${costReductionRate}, ${costReductionAmount}, ${safetyIncidentCount}, ${equipmentUtilization}, ${laborProductivity}, ${energyConsumption}, '${utils.randomChoice(remarks)}', 'ERP系统', NOW(), NOW())`);
        
        recordId++;
      }
      
      // 移动到下个月
      currentDate.setMonth(currentDate.getMonth() + 1);
      // 如果超过结束日期则停止
      if (currentDate > endDate) break;
    }
  });
  
  // 分批插入，每500条一个INSERT语句
  const batchSize = 500;
  for (let i = 0; i < efficiencyData.length; i += batchSize) {
    const batch = efficiencyData.slice(i, i + batchSize);
    sql += `INSERT INTO \`production_efficiency\` VALUES\n${batch.join(',\n')};\n\n`;
  }
  
  return sql;
}

// 生成党建生产关联数据
function generatePartyProductionLinks() {
  console.log('生成党建生产关联数据...');
  let sql = '';
  const linkData = [];
  
  // 项目规模权重
  const projectScales = ['小型项目', '中型项目', '大型项目', '重大项目'];
  const scaleWeights = [0.4, 0.3, 0.2, 0.1];
  
  // 验证人池
  const verifiers = ['张伟', '李强', '陈明', '赵静', '刘洋', '吴刚', '孙磊', '周婷', '郑华', '王芳'];
  
  let linkId = 1;
  
  // 为每个活动生成关联记录
  const maxActivityId = Math.min(1500, config.recordCounts.activities);
  for (let activityId = 1; activityId <= maxActivityId; activityId++) {
    // 每个活动关联1-3个党员
    const memberCount = utils.randomInt(1, 3);
    
    for (let i = 0; i < memberCount; i++) {
      if (linkId > config.recordCounts.links) break;
      
      const orgCode = `PO${Math.ceil(Math.random() * 10).toString().padStart(3, '0')}`;
      const linkType = utils.randomInt(1, 5);
      
      // 根据关联类型生成不同的指标
      let productionImpact, innovationContribution, qualityImprovement, costSaving, efficiencyImprovement, safetyImprovement;
      
      switch(linkType) {
        case 1: // 技术攻关
          productionImpact = utils.randomFloat(0.08, 0.35, 4);
          innovationContribution = utils.randomInt(3, 8);
          qualityImprovement = utils.randomFloat(0.008, 0.025, 4);
          costSaving = utils.randomFloat(15, 80, 2);
          efficiencyImprovement = utils.randomFloat(0.1, 0.3, 4);
          safetyImprovement = utils.randomInt(0, 2);
          break;
        case 2: // 质量改进
          productionImpact = utils.randomFloat(0.05, 0.2, 4);
          innovationContribution = utils.randomInt(2, 6);
          qualityImprovement = utils.randomFloat(0.01, 0.03, 4);
          costSaving = utils.randomFloat(10, 50, 2);
          efficiencyImprovement = utils.randomFloat(0.05, 0.15, 4);
          safetyImprovement = utils.randomInt(0, 1);
          break;
        case 3: // 成本节约
          productionImpact = utils.randomFloat(0.03, 0.15, 4);
          innovationContribution = utils.randomInt(1, 5);
          qualityImprovement = utils.randomFloat(0.005, 0.015, 4);
          costSaving = utils.randomFloat(20, 100, 2);
          efficiencyImprovement = utils.randomFloat(0.03, 0.12, 4);
          safetyImprovement = 0;
          break;
        case 4: // 效率提升
          productionImpact = utils.randomFloat(0.06, 0.25, 4);
          innovationContribution = utils.randomInt(2, 7);
          qualityImprovement = utils.randomFloat(0.006, 0.018, 4);
          costSaving = utils.randomFloat(8, 40, 2);
          efficiencyImprovement = utils.randomFloat(0.08, 0.25, 4);
          safetyImprovement = utils.randomInt(0, 1);
          break;
        case 5: // 安全改善
          productionImpact = utils.randomFloat(0.04, 0.18, 4);
          innovationContribution = utils.randomInt(1, 4);
          qualityImprovement = utils.randomFloat(0.004, 0.012, 4);
          costSaving = utils.randomFloat(5, 30, 2);
          efficiencyImprovement = utils.randomFloat(0.02, 0.1, 4);
          safetyImprovement = utils.randomInt(1, 4);
          break;
      }
      
      const projectDuration = utils.randomInt(7, 180);
      
      // 加权随机选择项目规模
      const rand = Math.random();
      let cumulative = 0;
      let projectScale = '小型项目';
      for (let j = 0; j < scaleWeights.length; j++) {
        cumulative += scaleWeights[j];
        if (rand <= cumulative) {
          projectScale = projectScales[j];
          break;
        }
      }
      
      const verificationStatus = utils.randomInt(1, 3);
      const verificationPerson = verificationStatus > 1 ? utils.randomChoice(verifiers) : null;
      const verificationTime = verificationStatus > 1 ? utils.formatDate(utils.randomDate(new Date('2025-01-01'), new Date(config.endDate))) : null;
      
      const achievementDescriptions = [
        '通过技术创新解决了生产瓶颈问题',
        '优化工艺流程提高了生产效率',
        '改进质量管理体系提升了产品合格率',
        '实施成本控制措施降低了生产成本',
        '加强安全管理减少了安全事故',
        '开展技术培训提升了员工技能水平',
        '引进新设备提高了自动化程度',
        '优化生产布局缩短了物流距离'
      ];
      
      linkData.push(`(${linkId}, 'PL${linkId.toString().padStart(4, '0')}', 'PA${activityId.toString().padStart(4, '0')}', 'PM${utils.randomInt(1, config.recordCounts.members).toString().padStart(3, '0')}', '${orgCode}', ${linkType}, ${productionImpact}, ${innovationContribution}, ${qualityImprovement}, ${costSaving}, ${efficiencyImprovement}, ${safetyImprovement}, ${projectDuration}, '${projectScale}', '${utils.randomChoice(achievementDescriptions)}', ${verificationStatus}, ${verificationPerson ? `'${verificationPerson}'` : 'NULL'}, ${verificationTime ? `'${verificationTime}'` : 'NULL'}, NOW(), NOW())`);
      
      linkId++;
    }
  }
  
  // 分批插入，每500条一个INSERT语句
  const batchSize = 500;
  for (let i = 0; i < linkData.length; i += batchSize) {
    const batch = linkData.slice(i, i + batchSize);
    sql += `INSERT INTO \`party_production_link\` VALUES\n${batch.join(',\n')};\n\n`;
  }
  
  return sql;
}

// 主函数
function generateBulkInsertSQL() {
  console.log('开始生成批量插入数据SQL文件...');
  
  let sqlContent = `/*\n批量插入数据SQL文件\n生成时间: ${new Date().toISOString()}\n时间范围: ${config.startDate} 到 ${config.endDate}\n数据量统计:\n`;
  sqlContent += `  - 党组织: ${config.recordCounts.organizations}条\n`;
  sqlContent += `  - 党员: ${config.recordCounts.members}条\n`;
  sqlContent += `  - 党建活动: ${config.recordCounts.activities}条\n`;
  sqlContent += `  - 生产效能: ${config.recordCounts.efficiency}条\n`;
  sqlContent += `  - 党建生产关联: ${config.recordCounts.links}条\n`;
  sqlContent += `*/\n\n`;
  
  sqlContent += 'SET NAMES utf8mb4;\n';
  sqlContent += 'SET FOREIGN_KEY_CHECKS = 0;\n\n';
  
  sqlContent += generateOrganizations();
  sqlContent += generatePartyMembers();
  sqlContent += generatePartyActivities();
  sqlContent += generateProductionEfficiency();
  sqlContent += generatePartyProductionLinks();
  
  sqlContent += 'SET FOREIGN_KEY_CHECKS = 1;\n';
  
  // 写入文件
  fs.writeFileSync(config.outputFile, sqlContent, 'utf8');
  console.log(`批量插入数据SQL文件已生成: ${config.outputFile}`);
  console.log(`数据时间范围: ${config.startDate} 到 ${config.endDate}`);
  console.log(`总数据量: ${Object.values(config.recordCounts).reduce((a, b) => a + b, 0)}条`);
}

// 执行生成
generateBulkInsertSQL();